package org.jeecg.modules.online.cgform.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.online.cgform.components.LinkDown;
import org.jeecg.modules.online.cgform.entity.OnlCgformField;
import org.jeecg.modules.online.cgform.entity.OnlCgformHead;
import org.jeecg.modules.online.cgform.model.TreeModel;

import java.util.List;
import java.util.Map;

/**
 * @Description: Online表单开发
 * @Author: jeecg-boot
 * @Date: 2019-03-12
 * @Version: V1.0
 */
public interface IOnlCgformFieldService extends IService<OnlCgformField> {
	
	/**
	 * 分页查询
	 * @param tbname 表名
	 * @param headId 表ID
	 * @param params 参数map
	 * @param needList 必需要查询的列的集合
	 * @return total:总数 ,records:分页List数据
	 */
	public Map<String,Object> queryAutolistPage(String tbname,String headId,Map<String,Object> params,List<String> needList);


	/**
	 * 删除数据（同时删除主表和子表关联数据）
	 * @param head
	 * @param ids (多个值逗号分隔)
	 */
	public void deleteAutoListMainAndSub(OnlCgformHead head, String ids);

	/**
	 * 通过主键id删除数据
	 */
	public void deleteAutoListById(String tbname,String ids);
	
	/**
	 * 删除表数据(主从表删除从表数据用到)
	 * @param tbname 表名
	 * @param linkField 关联字段名
	 * @param linkValue 关联字段值
	 */
	public void deleteAutoList(String tbname,String linkField,String linkValue);
	
	/**
	 * 保存
	 */
	public void saveFormData(String code,String tbname,JSONObject json,boolean isCrazy);
	
	/**
	 * 树的保存
	 * @param code
	 * @param tbname
	 * @param json
	 * @param hasChildField
	 * @param pidField
	 */
	public void saveTreeFormData(String code,String tbname,JSONObject json,String hasChildField,String pidField);
	
	/**
	 * 保存
	 */
	public void saveFormData(List<OnlCgformField> fieldList,String tbname,JSONObject json);
	
	/**
	  * 查询表单/列表的显示字段
	 * @param code
	 * @param isform true表示是查询表单字段isShowForm为1
	 * @return
	 */
	public List<OnlCgformField> queryFormFields(String code,boolean isform);

	/**
	 * 查询表单/列表的显示字段
	 *
	 * @param tableName
	 * @return
	 */
	public List<OnlCgformField> queryFormFieldsByTableName(String tableName);

	/**
	 * 查询表单/列表的显示字段
	 *
	 * @param tableName
	 * @return
	 */
	public OnlCgformField queryFormFieldByTableNameAndField(String tableName,String fieldName);

	/**
	 * 树编辑
	 */
	public void editTreeFormData(String code,String tbname,JSONObject json,String hasChildField,String pidField);
	
	/**
	 * 编辑
	 */
	public void editFormData(String code,String tbname,JSONObject json,boolean isCrazy);
	
	
	/**
	 * 查询表单数据
	 * @param code
	 * @param tbname
	 * @param id
	 * @return
	 */
	public Map<String,Object> queryFormData(String code,String tbname,String id);
	
	/**
	 * 查询表数据 
	 * @param fieldList 字段（需要查询 的字段）
	 * @param tbname 表名
	 * @param id 数据ID
	 * @return
	 */
	public Map<String,Object> queryFormData(List<OnlCgformField> fieldList,String tbname,String id);
	
	/**
	 * 查询表数据 （主从表查询从表数据）
	 * @param fieldList 字段（需要查询 的字段）
	 * @param tbname 表名
	 * @param linkField 关联字段名
	 * @param value 关联字段值
	 * @return
	 */
	public List<Map<String,Object>> querySubFormData(List<OnlCgformField> fieldList,String tbname,String linkField,String value);
	
	/**
	 * 获取列表的查询条件
	 * @param code
	 * @return 
	 *<br> field 数据库字段名称
	 *<br> label 数据库字段备注
	 *<br> view 展示方式 list-text-date  checkbox->多选下拉框..
	 *<br> mode 查询模式 single/group
	 * 
	 */
	public List<Map<String,String>> getAutoListQueryInfo(String code);
	
	/**
	 * 分页查询
	 * @param page Page<Map> page = new Page<Map>(pageNo, pageSize);
	 * @param sql 查询的SQL字符串
	 * @return
	 */
	public IPage<Map<String,Object>> selectPageBySql(Page<Map<String,Object>> page,@Param("sqlStr") String sql);
	
	
	/**
	  * 查询需要被隐藏的列  
	 * @param tbname 表名
	 * @return
	 */
	public List<String> selectOnlineHideColumns(String tbname);

	/**
	 * 查询有效的列集合 (online配置为显示+角色授权显示)
	 * @param cgFormId online主表配置ID
	 * @param tbname 表名
	 * @param taskId
	 * @param isList 是否是列表 true为列表字段 ，false为表单字段
	 * @return
	 */
	public List<OnlCgformField> queryAvailableFields(String cgFormId,String tbname,String taskId,boolean isList);
	
	/**
	 * 查询被禁用的字段
	 * @param tbname
	 * @return
	 */
	public List<String> queryDisabledFields(String tbname);

	/**
	 * 查询 流程节点权限 被禁用的字段
	 * @param tbname
	 * @param taskId
	 * @return
	 */
	public List<String> queryDisabledFields(String tbname,String taskId);
	
	/**
	 * 根据所有字段集合查询有效字段
	 * @param tbname
	 * @param isList
	 * @param List
	 * @param needList 必须查询的字段
	 * @return
	 */
	public List<OnlCgformField> queryAvailableFields(String tbname,boolean isList,List<OnlCgformField> List,List<String> needList);
	
	
	/**
	 * 执行Insert SQL语句
	 */
	public void executeInsertSQL(Map<String,Object> params);
	
	/**
	 * 执行Updatet SQL语句
	 */
	public void executeUpdatetSQL(Map<String,Object> params);

	/**
	 * 查询 级联数据
	 * @param linkDown
	 * @return
	 */
	public List<TreeModel> queryDataListByLinkDown(LinkDown linkDown);

	/**
	 * 修改树状态 无子节点的has_child设置为0
	 * @param tableName
	 * @param filed
	 * @param id
	 */
	public void updateTreeNodeNoChild(String tableName, String filed, String id);
	
}
